/**
 * 应用程序的入口文件
 * 主要负责创建应用实例并配置全局中间件、拦截器、管道等
 */
import { NestFactory, Reflector } from '@nestjs/core';
import { AppModule } from './app.module';
import { ResponseInterceptor } from 'src/common/interceptors/response.interceptor';
import { ValidationPipe } from '@nestjs/common';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { HttpExceptionFilter } from './common/filters/http-exception.filter';
import { LoggerService } from './modules/shared/logger.service';

async function bootstrap() {
  // 创建 NestJS 应用实例
  const app = await NestFactory.create(AppModule);

  // 设置全局路由前缀，所有的路由都会加上 /api 前缀
  app.setGlobalPrefix('api');

  /**
   * 全局响应拦截器
   * 作用：统一处理所有接口的返回格式
   * 将返回数据统一包装为 { code, message, data } 的格式
   */
  app.useGlobalInterceptors(new ResponseInterceptor(new Reflector()));

  /**
   * 全局验证管道
   * 作用：
   * 1. 自动验证请求参数（配合 class-validator 使用）
   * 2. transform: true - 自动转换参数类型（如字符串转数字）
   * 3. whitelist: true - 过滤掉 DTO 中未定义的属性
   */
  app.useGlobalPipes(
    new ValidationPipe({
      transform: true,
      whitelist: true
      // forbidNonWhitelisted: true, // 当请求中包含未定义的属性时返回 400 错误
    })
  );

  /**
   * 全局异常过滤器
   * 作用：
   * 1. 统一处理所有异常（HTTP异常、业务异常等）
   * 2. 统一异常响应格式
   * 3. 通过 LoggerService 记录错误日志
   */
  app.useGlobalFilters(new HttpExceptionFilter(new LoggerService()));

  // 允许跨域请求
  app.enableCors();

  /**
   * Swagger API 文档配置
   * 访问地址：/swagger
   * 用于生成接口文档，方便前后端对接
   */
  const config = new DocumentBuilder()
    .setTitle('lyf-admin')
    .setDescription('lyf-admin接口文档')
    .setVersion('1.0')
    .addBearerAuth()
    .build();
  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('swagger', app, document);

  // 启动应用，监听 8888 端口
  await app.listen(8888);
}
bootstrap();
